package com.autorun.server.controller;

import com.autorun.server.dto.ApiResponse;
import com.autorun.server.dto.ConfigRequest;
import com.autorun.server.entity.Config;
import com.autorun.server.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 配置管理控制器
 * 
 * @author autorun
 * @version 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/api/configs")
public class ConfigController {

    @Autowired
    private ConfigService configService;

    /**
     * 创建配置
     * 
     * @param request 配置请求
     * @return 配置信息
     */
    @PostMapping
    public ApiResponse<Config> createConfig(@Valid @RequestBody ConfigRequest request) {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            
            Config config = configService.createConfig(userId, request);
            return ApiResponse.success("创建配置成功", config);
        } catch (Exception e) {
            log.error("创建配置失败: {}", e.getMessage(), e);
            return ApiResponse.error("创建配置失败: " + e.getMessage());
        }
    }

    /**
     * 获取用户配置列表
     * 
     * @return 配置列表
     */
    @GetMapping
    public ApiResponse<List<Config>> getUserConfigs() {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            
            List<Config> configs = configService.getUserConfigs(userId);
            return ApiResponse.success(configs);
        } catch (Exception e) {
            log.error("获取配置列表失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取配置列表失败: " + e.getMessage());
        }
    }

    /**
     * 获取单个配置
     * 
     * @param id 配置ID
     * @return 配置信息
     */
    @GetMapping("/{id}")
    public ApiResponse<Config> getConfig(@PathVariable Integer id) {
        try {
            Config config = configService.getConfigById(id);
            return ApiResponse.success(config);
        } catch (Exception e) {
            log.error("获取配置失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取配置失败: " + e.getMessage());
        }
    }

    /**
     * 更新配置
     * 
     * @param id 配置ID
     * @param request 配置请求
     * @return 配置信息
     */
    @PutMapping("/{id}")
    public ApiResponse<Config> updateConfig(@PathVariable Integer id, @Valid @RequestBody ConfigRequest request) {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            
            Config config = configService.updateConfig(id, userId, request);
            return ApiResponse.success("更新配置成功", config);
        } catch (Exception e) {
            log.error("更新配置失败: {}", e.getMessage(), e);
            return ApiResponse.error("更新配置失败: " + e.getMessage());
        }
    }

    /**
     * 删除配置
     * 
     * @param id 配置ID
     * @return 成功消息
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteConfig(@PathVariable Integer id) {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            
            configService.deleteConfig(id, userId);
            return ApiResponse.success("删除配置成功");
        } catch (Exception e) {
            log.error("删除配置失败: {}", e.getMessage(), e);
            return ApiResponse.error("删除配置失败: " + e.getMessage());
        }
    }

    /**
     * 获取支持的游戏列表
     * 
     * @return 游戏列表
     */
    @GetMapping("/games")
    public ApiResponse<List<String>> getSupportedGames() {
        try {
            List<String> games = configService.getSupportedGames();
            return ApiResponse.success(games);
        } catch (Exception e) {
            log.error("获取游戏列表失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取游戏列表失败: " + e.getMessage());
        }
    }

    /**
     * 获取游戏配置模板
     * 
     * @param game 游戏名
     * @return 配置模板
     */
    @GetMapping("/templates/{game}")
    public ApiResponse<List<Map<String, Object>>> getGameConfigTemplate(@PathVariable String game) {
        try {
            List<Map<String, Object>> template = configService.getGameConfigTemplate(game);
            return ApiResponse.success(template);
        } catch (Exception e) {
            log.error("获取配置模板失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取配置模板失败: " + e.getMessage());
        }
    }
}

/**
 * 脚本端API控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/script")
class ScriptController {

    @Autowired
    private ConfigService configService;

    /**
     * 脚本端获取配置
     * 
     * @param request 配置请求
     * @return 配置响应
     */
    @PostMapping("/config")
    public ApiResponse<Map<String, Object>> getScriptConfig(@RequestBody Map<String, Object> request) {
        try {
            Integer configId = (Integer) request.get("config_id");
            Integer version = (Integer) request.get("version");
            
            if (configId == null) {
                return ApiResponse.error("配置ID不能为空");
            }
            
            Map<String, Object> response = configService.getScriptConfig(configId, version);
            return ApiResponse.success(response);
        } catch (Exception e) {
            log.error("获取脚本配置失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取脚本配置失败: " + e.getMessage());
        }
    }
}